﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using Domain.Model;

namespace BelDecor.Net.Pages
{
    public partial class Fornecedor : BasePage
    {


        #region EventosPagina
        protected void Page_Load(object sender, EventArgs e)
        {

            if (!IsPostBack)
            {
                ValidaSeguranca("Fornecedor");
            }
        }

        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            RadButton btn = ((RadButton)sender);
            int idFornecedor = 0;
            Domain.Model.Telefone telefone = null;
            Domain.Model.Endereco endereco = null;
            Domain.Model.Fornecedor fornecedor = null;

            var valid = ValidaFornecedor();

            if (valid == false)
                return;

            try
            {

                if (!string.IsNullOrEmpty(btn.CommandArgument))
                {
                    idFornecedor = int.Parse(btn.CommandArgument.ToString());
                }

                if (idFornecedor > 0)
                {
                    fornecedor = Domain.Model.Fornecedor.SingleOrDefault(f => f.Id_fornecedor == idFornecedor);

                    if (fornecedor != null)
                    {
                        SetAtributesFornecedor(ref fornecedor);

                        if (fornecedor.IdTelefone.HasValue)
                        {
                            telefone = Domain.Model.Telefone.SingleOrDefault(t => t.Id_Telefone == fornecedor.IdTelefone);
                        }
                        else
                        {
                            if (telefone == null)
                                telefone = new Domain.Model.Telefone();
                        }

                        SetAtributesTelefone(ref telefone);

                        if (fornecedor.IdEndereco.HasValue)
                        {
                            endereco = Domain.Model.Endereco.SingleOrDefault(end => end.IdEndereco == fornecedor.IdEndereco);
                        }
                        else
                        {
                            if (endereco == null)
                                endereco = new Domain.Model.Endereco();
                        }

                        SetAtributesEndereco(ref endereco);
                    }
                    else
                    {
                        RadWindowManager1.RadAlert("Não foi possível encontrar os dados do funcionário.", 0, 0, "Atenção", "");
                        return;
                    }

                    //alteração
                }
                else
                {
                    //inclusão
                    endereco = new Domain.Model.Endereco();
                    telefone = new Domain.Model.Telefone();
                    fornecedor = new Domain.Model.Fornecedor();

                    SetAtributesEndereco(ref endereco);
                    SetAtributesTelefone(ref telefone);
                    SetAtributesFornecedor(ref fornecedor);
                }

                //salva objetos
                endereco.Save();
                telefone.Save();

                fornecedor.IdTelefone = telefone.Id_Telefone;
                fornecedor.IdEndereco = endereco.IdEndereco;
                fornecedor.Save();

                ResetaTela();
                PopulaGridFornecedor(txtConsultarNome.Text, txtConsultarCNPJ.Text, txtConsultarCPF.Text);
                RadWindowManager1.RadAlert("Operação concluída com sucesso.", 0, 0, "Atenção", "");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            pnlConsultarFornecedor.Visible = true;
        }

        protected void btnNovo_Click(object sender, EventArgs e)
        {
            ConfiguraInclusao();
            pnlConsultarFornecedor.Visible = false;
        }

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                PopulaGridFornecedor(txtConsultarNome.Text, txtConsultarCNPJ.Text, txtConsultarCPF.Text);
            }
            catch (Exception)
            {
                throw;
            }

        }

        #endregion

        #region Grid

        protected void grdFornecedor_ItemCommand(object sender, GridCommandEventArgs e)
        {
            int idCli = 0;

            if (e.CommandArgument != "") idCli = int.Parse(e.CommandArgument.ToString());

            if (e.CommandName == "Editar")
            {
                PopulaEdicaoFornecedor(idCli);
            }
            else if (e.CommandName == "Excluir")
            {
                ExcluirFornecedor(idCli);
            }

            if (e.CommandName == Telerik.Web.UI.RadGrid.ExportToExcelCommandName ||
                    e.CommandName == Telerik.Web.UI.RadGrid.ExportToWordCommandName ||
                    e.CommandName == Telerik.Web.UI.RadGrid.ExportToCsvCommandName)
            {
                ConfigureExportgrd();
            }
        }

        #endregion

        #region Metodos
        public void ConfigureExportgrd()
        {
            grdFornecedor.ExportSettings.ExportOnlyData = true;
            grdFornecedor.ExportSettings.IgnorePaging = true;
            grdFornecedor.ExportSettings.OpenInNewWindow = true;
            grdFornecedor.ExportSettings.FileName = string.Format("Fornecedor_{0}", DateTime.Now.Ticks);
        }

        void ConfiguraInclusao()
        {
            pnlIncluirEditar.Visible = true;

            txtNome.Text = string.Empty;
            txtEmail.Text = string.Empty;
            txtCadastroCPF.Text = string.Empty;
            txtCnpj.Text = string.Empty;
            txtRazaoSocial.Text = string.Empty;
            txtFaxDDD.Text = string.Empty;
            txtFax.Text = string.Empty;
            txtLogradouroEndereco.Text = string.Empty;
            txtNumeroEndereco.Text = string.Empty;
            txtComplemento.Text = string.Empty;
            txtBairroEndereco.Text = string.Empty;
            txtCidadeEndereco.Text = string.Empty;
            txtUF.Text = string.Empty;
            txtCEPCadastro.Text = string.Empty;
            txtTelefoneResidencialDDD.Text = string.Empty;
            txtTelefoneResidencial.Text = string.Empty;
            txtTelefoneCelularDDD.Text = string.Empty;
            txtTelefoneCelular.Text = string.Empty;

        }

        void ResetaTela()
        {
            pnlIncluirEditar.Visible = false;
            btnSalvar.CommandArgument = string.Empty;
            txtNome.Text = string.Empty;
            txtEmail.Text = string.Empty;
            txtCadastroCPF.Text = string.Empty;
            txtCnpj.Text = string.Empty;
            txtLogradouroEndereco.Text = string.Empty;
            txtNumeroEndereco.Text = string.Empty;
            txtComplemento.Text = string.Empty;
            txtBairroEndereco.Text = string.Empty;
            txtCidadeEndereco.Text = string.Empty;
            txtUF.Text = string.Empty;
            txtCEPCadastro.Text = string.Empty;
            txtTelefoneResidencialDDD.Text = string.Empty;
            txtTelefoneResidencial.Text = string.Empty;
            txtTelefoneCelularDDD.Text = string.Empty;
            txtTelefoneCelular.Text = string.Empty;
            txtRazaoSocial.Text = string.Empty;
            txtFaxDDD.Text = string.Empty;
            txtFax.Text = string.Empty;

        }

        bool ValidaFornecedor()
        {
            if (string.IsNullOrEmpty(txtNome.Text))
            {
                RadWindowManager1.RadAlert("Informe o campo Nome.", 0, 0, "Atenção", "");
                pnlIncluirEditar.FocusControl(txtNome);
                return false;
            }

            if (string.IsNullOrEmpty(txtRazaoSocial.Text))
            {
                RadWindowManager1.RadAlert("Informe o campo Razão Social.", 0, 0, "Atenção", "");
                pnlIncluirEditar.FocusControl(txtRazaoSocial);
                return false;
            }

            if (string.IsNullOrEmpty(txtEmail.Text))
            {
                RadWindowManager1.RadAlert("Informe o campo email.", 0, 0, "Atenção", "");
                pnlIncluirEditar.FocusControl(txtEmail);
                return false;
            }
            if (!string.IsNullOrWhiteSpace(txtCadastroCPF.Text) || !string.IsNullOrWhiteSpace(txtCnpj.Text))
            {
                string cpf = txtCadastroCPF.Text.Trim();
                string cnpj = txtCnpj.Text.Trim();


                IList<Pessoa> lista = Pessoa.Find(p => (!string.IsNullOrEmpty(cpf) ? p.cpf == cpf : true) ||
                 (!string.IsNullOrEmpty(cnpj) ? p.cnpj == cnpj : true));


                if (lista.Count > 1)
                {
                    RadWindowManager1.RadAlert("Usuário já cadastrado na base de dados!", 0, 0, "Atenção", "");
                    pnlIncluirEditar.FocusControl(txtNome);
                    return false;
                }

            }

            return true;
        }

        void SetAtributesFornecedor(ref Domain.Model.Fornecedor fornecedor)
        {
            fornecedor.nome = txtNome.Text;
            fornecedor.Razao_Social = txtRazaoSocial.Text;
            fornecedor.cnpj = txtCnpj.Text;
            fornecedor.cpf = txtCadastroCPF.Text;
            fornecedor.faxDDD = txtFaxDDD.Text;
            fornecedor.fax = txtFax.Text;
            fornecedor.email = txtEmail.Text;
        }

        void SetAtributesTelefone(ref Domain.Model.Telefone telefone)
        {
            telefone.ddd_fixo = txtTelefoneResidencialDDD.Text;
            telefone.Numero_Fixo = txtTelefoneResidencial.Text;
            telefone.Ddd_Cel = txtTelefoneCelularDDD.Text;
            telefone.celular = txtTelefoneCelular.Text;
        }

        void SetAtributesEndereco(ref Domain.Model.Endereco endereco)
        {
            endereco.logradouro = txtLogradouroEndereco.Text;
            endereco.numero = txtNumeroEndereco.Text;
            endereco.complemento = txtComplemento.Text;
            endereco.bairro = txtBairroEndereco.Text;
            endereco.cidade = txtCidadeEndereco.Text;
            endereco.estado = txtUF.Text;
            endereco.cep = txtCEPCadastro.Text;
            endereco.pais = txtPais.Text;
        }

        void PopulaGridFornecedor(string nome = "",
                                   string cnpj = "",
                                   string cpf = "")
        {
            var lstFuncionarios = VwFornecedor.All().Where(c =>
                                                            (!string.IsNullOrEmpty(nome.Trim()) ? c.nome.Contains(nome.Trim()) : true)
                                                            && (!string.IsNullOrEmpty(cnpj.Trim()) ? c.cnpj == cnpj.Trim() : true)
                                                            && (!string.IsNullOrEmpty(cpf.Trim()) ? c.cpf == cpf.Trim() : true)).ToList();

            grdFornecedor.DataSource = lstFuncionarios;
            grdFornecedor.DataBind();
            pnlGridBusca.Visible = true;
        }


        private void ExcluirFornecedor(int idFornecedor)
        {
            try
            {
                Domain.Model.Fornecedor.Delete(c => c.Id_fornecedor == idFornecedor);
                RadWindowManager1.RadAlert("Operação concluída com sucesso.", 0, 0, "Atenção", "");
                PopulaGridFornecedor();
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void PopulaEdicaoFornecedor(int idFornecedor)
        {
            var fornecedor = VwFornecedor.SingleOrDefault(f => f.Id_fornecedor == idFornecedor);
            btnSalvar.CommandArgument = idFornecedor.ToString();

            if (fornecedor != null)
            {
                txtNome.Text = fornecedor.nome;
                txtEmail.Text = fornecedor.email;
                txtCadastroCPF.Text = fornecedor.cpf;
                txtCnpj.Text = fornecedor.cnpj;
                txtRazaoSocial.Text = fornecedor.Razao_Social;
                txtLogradouroEndereco.Text = fornecedor.logradouro;
                txtNumeroEndereco.Text = fornecedor.numero;
                txtComplemento.Text = fornecedor.complemento;
                txtBairroEndereco.Text = fornecedor.bairro;
                txtCidadeEndereco.Text = fornecedor.cidade;
                txtUF.Text = fornecedor.estado;
                txtCEPCadastro.Text = fornecedor.cep;
                txtFaxDDD.Text = fornecedor.faxDDD;
                txtFax.Text = fornecedor.fax;
                txtTelefoneResidencialDDD.Text = fornecedor.ddd_fixo;
                txtTelefoneResidencial.Text = fornecedor.Numero_Fixo;
                txtTelefoneCelularDDD.Text = fornecedor.Ddd_Cel;
                txtTelefoneCelular.Text = fornecedor.celular;
                txtPais.Text = fornecedor.pais;
                pnlIncluirEditar.Visible = true;
            }
        }
        #endregion

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            ResetaTela();
        }

    }
}